diff --git a/django/db/models/query.py b/django/db/models/query.py
index 07d6ffd4ca..472f4a3daa 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1817,7 +1817,13 @@ def prefetch_one_level(instances, prefetcher, lookup, level):
     # in a dictionary.
 
     rel_qs, rel_obj_attr, instance_attr, single, cache_name, is_descriptor = (
-        prefetcher.get_prefetch_queryset(instances, lookup.get_current_queryset(level)))
+        prefetcher.get_prefetch_queryset(instances, lookup.get_current_queryset(level))
+    )
+
+    # Check if the field related to the prefetch is non-nullable and exclude None values
+    if hasattr(prefetcher, 'field') and not prefetcher.field.null:
+        rel_qs = rel_qs.exclude(**{prefetcher.field.name + '__isnull': True})
+
     # We have to handle the possibility that the QuerySet we just got back
     # contains some prefetch_related lookups. We don't want to trigger the
     # prefetch_related functionality by evaluating the query. Rather, we need
